#pragma once
#include <iostream>
#include "Log/log.hpp"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <cstring>

namespace mycode
{
    #define MAX_FD 1024

    const static int defaultfd = -1;
    enum ERR
    {
        SOCKETERR = 1,
        BINDERR,
        LISTENERR,
        CONNECTERR,
        USEERR,
        WRITEERR
    };

    class TCP
    {
    public:
        TCP(const string ip, const uint16_t port);
        ~TCP();

        // 绑定socket
        void TCP_Bind();
        // 设置监听模式
        void TCP_Listen();
        // 接收请求
        int TCP_Accept(struct sockaddr* peer, socklen_t* len);
        // 建立连接
        void TCP_Connect();
        // 获取socket
        int getSocket();
        // 服务器初始化
        void server_init();
        // 服务器开始
        void server_start();
        void HanderEvent(fd_set* pfset);

    private:
        int _socket;    // socket文件描述符
        string _ip;     // ip地址
        uint16_t _port; // 端口号

        struct sockaddr_in* _paddr; // socket地址
        int _fdset[MAX_FD];         // 合法文件描述符
    };
}